package uniquindio.facing.ingesis.moviles.undroiq.activity;

import java.util.ArrayList;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import uniquindio.facing.ingesis.moviles.undroiq.contantes.ConstantesGenerales;
import uniquindio.facing.ingesis.moviles.undroiq.http.Httppostaux;
import uniquindio.facing.ingesis.moviles.undroiq.utilitarios.Utils;
import uniquindio.facing.ingesis.moviles.undroiq.utilitarios.Validacion;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

/**
 * Clase que hereda de un Activity, encargada de realizar el registro de usuario
 * al sistema.
 * 
 * @author Richard Alexander Ortiz Salinas
 * 
 */
public class RegistroActivity extends Activity {

	// Views de la actividad Registro
	private EditText user;
	private EditText email;
	private EditText pass;

	// Atributos para la conexion remota
	boolean result_back;
	private ProgressDialog pDialog;
	Httppostaux post;

	/**
	 * Metodo OnCreate, inicializa la actividad y obtiene los views
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_registro);
		post = new Httppostaux();
		user = (EditText) findViewById(R.id.txtUserName);
		email = (EditText) findViewById(R.id.txtEmail);
		pass = (EditText) findViewById(R.id.txtPass);

	}

	/**
	 * Metodo encargado de capturar el evento del boton a la hora de realizar el
	 * registro un usuario.
	 * 
	 * @param view
	 */
	public void onClickLinkToRegister(View view) {
		Log.i(ConstantesGenerales.UNDROIQ, ConstantesGenerales.LINK_REGISTER);

		String usuario = user.getText().toString();
		String mail = email.getText().toString();
		String passw = pass.getText().toString();

		if (Validacion.validarIngreso(usuario, passw, usuario)) {

			if (Validacion.validarCorreo(usuario)) {

				// si pasamos esa validacion ejecutamos el asynctask pasando
				// el
				// usuario y clave como parametros

				new asyncRegister().execute(usuario, passw, mail);

			} else {
				Validacion.err_email(this);
			}
		} else {
			Validacion.err_empy_registrer(this);
		}
	}

	/**
	 * Metodo encargado de capturar el evento del boton a la hora de retonar a
	 * la actividad del login.
	 * 
	 * @param view
	 */
	public void onClickLinkToLogin(View view) {
		Log.i(ConstantesGenerales.UNDROIQ, ConstantesGenerales.LINK_LOGIN);

		Intent intent = new Intent(this, LoginActiviy.class);
		startActivity(intent);
	}

	/**
	 * Metodo para validar el estado del registro, solamente necesita como
	 * parametros el email, username y password del usuario
	 */
	public int regstatus(String email, String username, String password) {
		int regstatus = -1;

		ArrayList<NameValuePair> postparameters2send = new ArrayList<NameValuePair>();

		postparameters2send.add(new BasicNameValuePair(
				ConstantesGenerales.EMAIL, email));
		postparameters2send.add(new BasicNameValuePair(
				ConstantesGenerales.USER, username));
		postparameters2send.add(new BasicNameValuePair(
				ConstantesGenerales.PASSWORD, password));

		JSONArray jdata = post.getserverdata(postparameters2send,
				ConstantesGenerales.URL_CONNECT);

		SystemClock.sleep(950);

		// si lo que obtuvimos no es null
		if (jdata != null && jdata.length() > 0) {

			JSONObject json_data; // creamos un objeto JSON
			try {
				json_data = jdata.getJSONObject(0); // leemos el primer segmento
				// en nuestro caso el unico
				// accedemos al valor
				regstatus = json_data.getInt(ConstantesGenerales.REGSTATUS);
				Log.e(ConstantesGenerales.UNDROIQ,
						ConstantesGenerales.JSON_STATUS + regstatus);
				// muestro por log que obtuvimos
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			if (regstatus == 0) {
				Log.e(ConstantesGenerales.UNDROIQ,
						ConstantesGenerales.REGISTRO_INVALIDO);
				return 0;
			}
			if (regstatus == 1) {
				Log.e(ConstantesGenerales.UNDROIQ,
						ConstantesGenerales.REGISTRO_INVALIDO);
				return 1;
			}
			if (regstatus == 2) {
				Log.e(ConstantesGenerales.UNDROIQ,
						ConstantesGenerales.REGISTRO_EXISTENTE);
				return 2;
			}

		} else {
			Log.e(ConstantesGenerales.UNDROIQ, ConstantesGenerales.JSON_ERROR);
			return 0;
		}
		return regstatus;

	}

	/**
	 * CLASE ASYNCTASK
	 * 
	 * Encargada de mostrar el dialogo de progreso mientras enviamos y obtenemos
	 * los datos podria hacerse lo mismo sin usar esto pero si el tiempo de
	 * respuesta es demasiado lo que podria ocurrir si la conexion es lenta o el
	 * servidor tarda en responder la aplicacion sera inestable. ademas
	 * observariamos el mensaje de que la app no responde.
	 */

	class asyncRegister extends AsyncTask<String, String, String> {

		String mail, pass, user;

		protected void onPreExecute() {
			// para el progress dialog
			pDialog = new ProgressDialog(RegistroActivity.this);
			pDialog.setMessage(ConstantesGenerales.MENSAJE_REGISTRAR);
			pDialog.setIndeterminate(false);
			pDialog.setCancelable(false);
			pDialog.show();
		}

		protected String doInBackground(String... params) {

			user = params[0];
			pass = params[1];
			mail = params[2];

			Log.e(ConstantesGenerales.UNDROIQ, ConstantesGenerales.DATOS + user
					+ email + pass);
			// enviamos y recibimos y analizamos los datos en segundo plano.
			int resultado = regstatus(mail, user, pass);

			if (resultado == 1) {
				return ConstantesGenerales.OK;
			}
			if (resultado == 0) {
				return ConstantesGenerales.ERROR;
			}
			if (resultado == 2) {
				return ConstantesGenerales.REP;
			}

			return ConstantesGenerales.ERROR;

		}

		/**
		 * Metodo encargado de ejecutar la accion establecida una vez terminado
		 * el doInBackground. Segun lo que halla ocurrido pasamos a la siguiente
		 * activity o mostramos el error ocurrido.
		 */
		protected void onPostExecute(String result) {

			pDialog.dismiss();
			Log.e(ConstantesGenerales.UNDROIQ, ConstantesGenerales.POSTEXECUTE
					+ result);

			if (result.equals(ConstantesGenerales.OK)) {

				Intent i = new Intent(RegistroActivity.this, LoginActiviy.class);
				startActivity(i);

			} else {
				if (result.equals(ConstantesGenerales.ERROR)) {

					Validacion.err_registro(RegistroActivity.this);

				} else if (result.equals(ConstantesGenerales.REP)) {

					Validacion.err_existente(RegistroActivity.this);

				}
			}
		}
	}
}